/**
 * 全局 API 请求拦截器
 * 用于统一处理 401 错误（Token 过期）并跳转到登录页
 */

import { logout } from './auth';

// 保存原始的 fetch 函数
const originalFetch = window.fetch;

// 是否正在处理 401 错误（避免重复跳转）
let isHandling401 = false;

/**
 * 处理 401 错误：清除登录状态并跳转到登录页
 */
async function handle401Error() {
  // 避免重复处理
  if (isHandling401) {
    return;
  }
  
  isHandling401 = true;
  
  try {
    console.log('🔒 Token 已过期，清除登录状态并跳转到登录页');
    
    // 清除登录状态
    await logout();
    
    // 触发自定义事件，通知 App.vue 更新登录状态
    window.dispatchEvent(new CustomEvent('token-expired'));
    
    // 延迟重置标志，避免短时间内重复触发
    setTimeout(() => {
      isHandling401 = false;
    }, 1000);
  } catch (error) {
    console.error('处理 401 错误失败:', error);
    // 即使处理失败，也要重置标志
    isHandling401 = false;
  }
}

/**
 * 拦截 fetch 请求，统一处理 401 错误
 */
export function setupApiInterceptor() {
  window.fetch = async function(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
    // 调用原始的 fetch
    const response = await originalFetch(input, init);
    
    // 检查响应状态码
    if (response.status === 401) {
      // 检查是否是登录接口（登录接口返回 401 是正常的，不应该跳转）
      const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
      const isLoginEndpoint = url.includes('/auth/login') || url.includes('/im/auth/login');
      
      if (!isLoginEndpoint) {
        // 非登录接口返回 401，说明 token 过期
        // 先克隆响应，避免消费后无法读取
        const clonedResponse = response.clone();
        
        // 异步处理 401 错误（不阻塞响应）
        handle401Error().catch(err => {
          console.error('处理 401 错误时发生异常:', err);
        });
        
        // 返回原始响应
        return clonedResponse;
      }
    }
    
    return response;
  };
  
  console.log('✅ API 拦截器已设置');
}

/**
 * 移除 API 拦截器（恢复原始 fetch）
 */
export function removeApiInterceptor() {
  window.fetch = originalFetch;
  console.log('✅ API 拦截器已移除');
}

